# Dockerfile是帮助我们构建镜像的脚本
# eg. 我要部署nginx
# 1. 下载nginx压缩包
# 2. 把压缩包丢到镜像里面去
# 3. 启动


# 以哪个镜像作为基础镜像
# 以哪个镜像去做二次开发
# 继承于其他的哪个镜像
FROM centos:7.1.1503

# 添加描述信息
LABEL a=b
LABEL maintainer="zhangsan<haha@hehe.com>"


# 把当前目录下的HELP.md文件放到镜像的/haha.md
# 当该镜像启动成容器后，就会在/看到一个haha.md文件
# ADD 可以支持http文件、压缩包（自动解压）、本地文件
# 建议src放在dockerfile目录或子目录
ADD HELP.md /haha.md


# COPY是ADD的阉割版
# 不能添加远程文件
# 不会自动解压
COPY HELP.md /haha.md

# 作用1：声明需要暴露的端口，增强可读性，说我是要暴露80端口，但是并不会
# 真的暴露80端口，真正的暴露是用docker -P || docker -p暴露
# 作用2：随机端口映射时，用来自动找到目标端口
EXPOSE 80

# 在构建期间，使用的参数
ARG a=b
# 在容器运行期间的环境变量
ENV c=d

# 让后面运行的所有命令，以某某用户运行
# 默认是root
USER nginx

# 相当于cd
WORKDIR /

# 在构建镜像期间执行的命令
RUN yum install nginx


# 指定一个挂载点（用来数据持久化）
# 容器一旦删除，数据就也会消失
VOLUME /tmp

# 运行一个命令
# Docker最佳实践
# 在容器内部只运行1个进程；并且该进程要前台运行，如果后台运行，那么容器会启动完成立刻停止
# CMD会被覆盖
## 1. 一个dockerfile中如果有多个CMD，那么只有最后1个会生效
## 2. docker run命令中 镜像名称后面的内容会作为命令覆盖CMD
## eg. 如果nginx镜像的Dockerfile内部是用的CMD，那么
## 如果运行docker run -d -p 80:80 nginx echo 123
## 则这个nginx容器只会运行echo 123，不会运行nginx -g 'daemon off'
CMD nginx -g 'daemon off'

# ENPOINT不能覆盖
## 如果一个dockerfile有多个ENTRYPOINT，那么也只有最后一条会生效
## 如果nginx镜像的Dockerfile内部用的是ENTRYPOINT，那么
## 如果运行docker run -d -p 80:80 nginx echo 123
## 就相当于执行nginx -g 'daemon off' echo 123
## 即：镜像后面的内容会作为参数，拼接到ENTRYPOINT指令之后
ENTRYPOINT nginx -g 'daemon off'

